package cn.com.dcsgo.config;

import feign.Logger;
import feign.Retryer;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * OrderServiceConfig
 *
 * @author Dcsgo
 * @since 2025/3/11 14:17
 */
@Configuration
public class OrderServiceConfig {
    /**
     * LoadBalanced注解 简化负载均衡
     * 在使用RestTemplate进行RPC时url直接写要调用的微服务名称
     * SpringCloud会自动获取host和port并进行负载均衡
     *
     * @return RestTemplate
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    /**
     * Feign日志配置
     * FULL 全量日志
     * 配置文件中也需要将Feign相关的日志级别设置为DEBUG
     * 详细说明参考：https://docs.spring.io/spring-cloud-openfeign/reference/spring-cloud-openfeign.html#feign-logging
     *
     * @return Logger.Level.FULL
     */
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

    /**
     * open feign 超时重试配置
     * Retryer 是个接口 我们可以自己实现这个接口也可以使用
     * Retryer 默认的一个实现 Retryer.Default
     * 第一次请求失败也算做一次重试
     *
     * @return Retryer
     */
    @Bean
    public Retryer retryer() {
        /*
        默认的超时重试策略是 等待100ms，下次等待时间为上一次等待时间*1.5，最大等待1s，最多重试5次
        public Default() {
            this(100L, TimeUnit.SECONDS.toMillis(1L), 5);
        }
        我们也可以通过另一个构造方法来修改默认的重试策略的配置
        public Default(long period, long maxPeriod, int maxAttempts) {
            this.period = period;
            this.maxPeriod = maxPeriod;
            this.maxAttempts = maxAttempts;
            this.attempt = 1;
        }
         */
        return new Retryer.Default();
    }
}
